package sword;

/**
 * @author caifangyi
 * @date 2022/8/17
 */

import java.util.Stack;

/**
 * 剑指 Offer 24. 反转链表
 *
 * 定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
 *
 * 
 *
 * 示例:
 *
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 * 
 *
 * 限制：
 *
 * 0 <= 节点个数 <= 5000
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

class Sword0024 {

    public static void main(String[] args) {

    }

    /**
     * Definition for singly-linked list.
     */
     public static class ListNode {
         int val;
         ListNode next;
         ListNode(int x) { val = x; }
     }

    static class Solution {
        public ListNode reverseList(ListNode head) {
            Stack<Integer> stackList = new Stack<>();
            initStack(stackList, head);
            if(stackList.isEmpty()){
                return head;
            }

            ListNode listNode = new ListNode(stackList.pop());
            ListNode tempNode = listNode;
            while (!stackList.isEmpty()){
                tempNode.next = new ListNode(stackList.pop());
                tempNode = tempNode.next;
            }
            return listNode;
        }


        private void initStack(Stack<Integer> stackList, ListNode head) {
            if(head==null){
                stackList.add(head.val);
                return;
            }
            stackList.add(head.val);
            initStack(stackList, head.next);
        }
    }


}
